package com.fengke.payment.tencent.protocol.unified_order_protocol;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

import com.fengke.payment.tencent.common.Configure;
import com.fengke.payment.tencent.common.RandomStringGenerator;
import com.fengke.payment.tencent.common.Signature;
/**
 * 统一下单接口请求参数
 * 除被扫支付场景以外，商户系统先调用该接口在微信支付服务后台生成预支付交易单，返回正确的预支付交易回话标识后再按扫码、JSAPI、APP等不同场景生成交易串调起支付。
 */
public class UnifiedOrderReqData {
	//每个字段具体的意思请查看API文档
    private String appid = "";
    private String mch_id = "";
    private String device_info = "";
    private String nonce_str = "";
    private String sign = "";
    private String body = "";
    private String detail = "";
    private String attach = "";
    private String out_trade_no = "";
    private String fee_type = "";
    private long total_fee = 0;
    private String spbill_create_ip = "";
    private String time_start = "";
    private String time_expire = "";
    private String goods_tag = "";
    private String notify_url = "";
    private String trade_type = "";
    private String product_id = "";
    private String openid = "";
    /**
     * @param body 商品或支付单简要描述 
     * @param out_trade_no 商户系统内部的订单号,32个字符内、可包含字母
     * @param total_fee 订单总金额，只能为整数，单位为分，不能包含小数
     * @param openid trade_type=JSAPI，此参数必传，用户在商户appid下的唯一标识。下单前需要调用【网页授权获取用户信息】接口获取到用户的Openid。
     */
    public UnifiedOrderReqData(String body, String out_trade_no, long total_fee, String openid) {
		// 商品或支付单简要描述 
		setBody(body);
		// 商品名称明细列表
//		setDetail(detail);
		// 附加数据，在查询API和支付通知中原样返回，该字段主要用于商户携带订单的自定义数据
//		setAttach(attach);
		// 商户系统内部的订单号,32个字符内、可包含字母
		setOut_trade_no(out_trade_no);
		// 订单总金额，只能为整数，单位为分，不能包含小数
		setTotal_fee(total_fee);
		// 订单生成时间，格式为yyyyMMddHHmmss，如2009年12月25日9点10分10秒表示为20091225091010。
//		setTime_start(time_start);
		// 订单失效时间，格式为yyyyMMddHHmmss，如2009年12月27日9点10分10秒表示为20091227091010。
//		setTime_expire(time_expire);
		// 商品标记，代金券或立减优惠功能的参数，说明详见代金券或立减优惠
//		setGoods_tag(goods_tag);
		// trade_type=NATIVE，此参数必传。此id为二维码中包含的商品ID，商户自行定义。 
//		setProduct_id(product_id);
		// trade_type=JSAPI，此参数必传，用户在商户appid下的唯一标识。下单前需要调用【网页授权获取用户信息】接口获取到用户的Openid。
		setOpenid(openid);
		
		// 默认参数
		
		// 微信分配的公众账号ID
		setAppid(Configure.getAppid());
		// 微信支付分配的商户号
		setMch_id(Configure.getMchid());
		// 终端设备号(门店号或收银设备ID)，注意：PC网页或公众号内支付请传"WEB"
		setDevice_info(Configure.getDeviceInfo());
		// 随机字符串，不长于32位。
		setNonce_str(RandomStringGenerator.getRandomStringByLength(Configure.getRandomStringLength()));
		// 符合ISO 4217标准的三位字母代码，默认人民币：CNY，
		setFee_type(Configure.getFeeType());
		// APP和网页支付提交用户端ip，Native支付填调用微信支付API的机器IP。
		setSpbill_create_ip(Configure.getSpbill_create_ip());
		// 接收微信支付异步通知回调地址
		setNotify_url(Configure.getNotifyUrl());
		// 取值如下：JSAPI，NATIVE，APP，WAP,详细说明见参数规定
		setTrade_type(Configure.getTradeType());
		// 签名
		try {
			setSign(Signature.getSign(this));
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
	public String getAppid() {
		return appid;
	}
	public void setAppid(String appid) {
		this.appid = appid;
	}
	public String getMch_id() {
		return mch_id;
	}
	public void setMch_id(String mch_id) {
		this.mch_id = mch_id;
	}
	public String getDevice_info() {
		return device_info;
	}
	public void setDevice_info(String device_info) {
		this.device_info = device_info;
	}
	public String getNonce_str() {
		return nonce_str;
	}
	public void setNonce_str(String nonce_str) {
		this.nonce_str = nonce_str;
	}
	public String getSign() {
		return sign;
	}
	public void setSign(String sign) {
		this.sign = sign;
	}
	public String getBody() {
		return body;
	}
	public void setBody(String body) {
		this.body = body;
	}
	public String getAttach() {
		return attach;
	}
	public void setAttach(String attach) {
		this.attach = attach;
	}
	public String getOut_trade_no() {
		return out_trade_no;
	}
	public void setOut_trade_no(String out_trade_no) {
		this.out_trade_no = out_trade_no;
	}
	public String getFee_type() {
		return fee_type;
	}
	public void setFee_type(String fee_type) {
		this.fee_type = fee_type;
	}
	public long getTotal_fee() {
		return total_fee;
	}
	public void setTotal_fee(long total_fee) {
		this.total_fee = total_fee;
	}
	public String getSpbill_create_ip() {
		return spbill_create_ip;
	}
	public void setSpbill_create_ip(String spbill_create_ip) {
		this.spbill_create_ip = spbill_create_ip;
	}
	public String getTime_start() {
		return time_start;
	}
	public void setTime_start(String time_start) {
		this.time_start = time_start;
	}
	public String getTime_expire() {
		return time_expire;
	}
	public void setTime_expire(String time_expire) {
		this.time_expire = time_expire;
	}
	public String getGoods_tag() {
		return goods_tag;
	}
	public void setGoods_tag(String goods_tag) {
		this.goods_tag = goods_tag;
	}
	public String getNotify_url() {
		return notify_url;
	}
	public void setNotify_url(String notify_url) {
		this.notify_url = notify_url;
	}
	public String getTrade_type() {
		return trade_type;
	}
	public void setTrade_type(String trade_type) {
		this.trade_type = trade_type;
	}
	public String getProduct_id() {
		return product_id;
	}
	public void setProduct_id(String product_id) {
		this.product_id = product_id;
	}
	public String getOpenid() {
		return openid;
	}
	public void setOpenid(String openid) {
		this.openid = openid;
	}
	public Map<String,Object> toMap(){
        Map<String,Object> map = new HashMap<String, Object>();
        Field[] fields = this.getClass().getDeclaredFields();
        for (Field field : fields) {
            Object obj;
            try {
                obj = field.get(this);
                if(obj!=null){
                    map.put(field.getName(), obj);
                }
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return map;
    }
	public String getDetail() {
		return detail;
	}
	public void setDetail(String detail) {
		this.detail = detail;
	}
}
